

#ifndef  _QL_MAIN_INTERFACE_H
#define  _QL_MAIN_INTERFACE_H

#include "common.h"
#include "lib_time.h"

#ifdef __cplusplus
extern "C"{
#endif

// 交互指令 
typedef enum
{
    RENEW_NET_FLAG=0,
    SAVE_CHARGE_RECORD,
    READ_CHARGE_RECORD,
    FIN_CHARGE_RECORD,
    SET_1ST_QRCODE,
    SET_2ND_QRCODE,
    UPDATA_FILES,
    SAVE_FEE_CFG,
	SET_STOP_DETAIL_REASON,  // 2021-07-04
	SET_BILL,
}CMDNUM;

// 电表实时数据 
typedef struct
{
    u8 mtid;
    u32 voltage[3];
    s32 current[3];
    u32 kWh[5];
    s32 Power;
    u8 read_flag;
    u8 failReadMt;//抄表失败故障
}MeterDataReal;

// 计算值获取的充电数据 
typedef struct
{
    u8 rateid;//时段号，也是费率号
    u32 curkWh[49];//当前累计电量
    u32 kWhStart[5];//开始充电时电表示值
    u32 kWhEnd[5];//开始充电时电表示值
    u32  charge_duration;//充电持续时间
    u32  start_soc;
    u32 end_soc;
    u32  cost_elec;
    u32 cost_server;
    TDateTime startChargingtime;//开始充电时时间
    TDateTime endChargingtime;//当前充电时时间
}MeterData_xj;

// 主控传输过来的CAN口更新数据 
union u_out_mx
{
	struct
	{
				//充电输出电流                   1
		short MX[64];	//充电输出电压    0
				// SOC                                  2
				//电池组最低温度                3
				//电池组最高温度                 4
				//单体电池最高电压             5
				//单体电池最低电压            6
				//充电机环境温度                7
				//充电导引电压                    8
				// BMS 需求电流                 9
				// BMS 需求电压                 10
				// 充电模式                         11
				//BMS 充电电压测量值       12
				//BMS 充电电流测量值       13
				// 估算剩余充电时间           14
				//充电接口温度探头 1 温度(接口 1 DC+)   15
				// 充电接口温度探头 2 温度(接口 1 DC-)    16
				// 充电接口温度探头 3 温度(接口 2 DC+)    17
				//充电接口温度探头 4 温度(接口 2 DC+)     18
//
//        交流输出 A 相电压                                              19
//		  交流输出 B 相电压                                             20
//		  交流输出 C 相电压                                              21
//		  交流输出 A 相电流                                              22
//		  交流输出 B 相电流                                             23
//		  交流输出 C 相电流                                              24
//        AB线间电压                                                         25
//        有功总电度低                                                      26
//        有功总电度高                                                     27


				//备用
				//...
				//备用
	} dc;
	struct
	{
		short MX[48];	//当前 A 相电压   0
				//当前 B 相电压                   1
				//当前 C 相电压                    2
				//当前 A 相电流                    3
				//当前 B 相电流                    4
				//当前 C 相电流                    5
				//充电导引电压                     6
				//输出 PWM 占空比              7
				//充电接口温度探头 1 温度(接口 1 DC+)           8
				// 充电接口温度探头 2 温度(接口 1 DC-)             9
				// 充电接口温度探头 3 温度(接口 2 DC+)           10
				//充电接口温度探头 4 温度(接口 2 DC+)             11

				//备用
				//...
				//备用
	} ac;
};
// zhouhao 2021-07-27 遥信数据
typedef struct
{
	unsigned char XYX1;		// 虚遥信数据
	unsigned char XYX2;		// 备用
	unsigned char XYX3;
	unsigned char XYX4;
}t_XYX_INFO;

// 开启充电时 BMS 数据信息 
typedef struct
{
	int MX1;	//  负荷控制开关
	int MX2;	// 成功标识
	int MX3;	// 失败原因

	struct
	{
		unsigned char MX4[3];	//充电桩与BMS通信协议版本号
		unsigned char MX5[3];	//BMS与充电桩通信协议版本号
		unsigned char MX6;	//充电桩与 BMS握手结果
		unsigned char MX7;	//电池类型
		unsigned char MX8;	// 最高允许温度
		unsigned short MX9;//BMS 最高允许充电电压
		unsigned short MX10;//单体最高允许充电电压
		unsigned short MX11;//最高允许充电电流
		unsigned short MX12;//整车动力蓄电池额定总电压
		unsigned short MX13;//整车动力蓄电池当前电压
		unsigned short MX14;//整车动力蓄电池额定容量
		unsigned short MX15;//整车动力蓄电池标称能量
		unsigned short MX16;//整车动力蓄电池荷电状态
		unsigned short MX17;//充电机最高输出电压
		unsigned short MX18;//充电机最低输出电压
		unsigned short MX19;//充电机最大输出电流
		unsigned short MX20;//充电机最小输出电流
		unsigned char MX21[17];	// 车辆识别码
	}dc;

}start_mx;

// 停止充电时 BMS数据信息 
typedef struct
{
	unsigned char MX1;	//   停止原因
	unsigned char MX2;	// 成功标识
	struct
	{

		unsigned char MX3;	// BMS 中止充电原因

		unsigned char MX4[2];	//BMS 充电故障原因

		unsigned char MX5;	//BMS 中止错误原因

		unsigned char MX6;	//中止荷电状态SOC（%）

		short MX7;	//动力蓄电池单体最低电压
		short MX8;	// 动力蓄电池单体最高电压
		unsigned char MX9;//动力蓄电池最低温度
		unsigned char MX10;// 动力蓄电池最高温度
		unsigned short MX11;//接收SPN2560=0x00的充电机辨识报文超时
		unsigned short MX12;//接收SPN2560=0xAA的充电机辨识报文超时
		unsigned short MX13;//接收充电机的时间同步和充电机最大输出能力报文超时
		unsigned short MX14;//接收充电机完成充电准备报文超时
		unsigned short MX15;//接收充电机充电状态报文超时
		unsigned short MX16;//接收充电机中止充电报文超
		unsigned short MX17;//接收充电机充电统计报文超时
		unsigned char MX18[6];// BMS 其他错误
		unsigned short MX19;//接收 BMS 和车辆的辨识报文超时
		unsigned short MX20;//接收电池充电参数报文超时
		unsigned short MX21;	// 接收 BMS 完成充 电准备报文超时
		unsigned short MX22;//接收电池充电总状 态报文超时
		unsigned short MX23;//接收电池充电要求报文超时
		unsigned short MX24;//接收 BMS 中止充电报文超时
		unsigned short MX25;//接收 BMS 充电统计报文超时
		unsigned char MX26[6];	// 充电机其他错误

	}dc;
}end_mx;

typedef struct{
	u16 charge_fee[48];
	u16  service_fee[48];
	u16 belate_fee[48];
} ql_fee_config;

// 申请充电参数 
typedef struct{
	u8	   guntab;
	u8	    billmode;//充电策略0:充满为止（默认）	1:时间控制充电	2:金额控制充电	3:电量控制充电	4:按 SOC 控制充电
	u32		value;//充电策略参数时间单位为 1 秒	金额单位为 0.01 元	电量时单位为 0.01kw	SOC 单位为%
	u8	    serialnum[32];//订单号--用户识别号(App)
	u8	    allow_offline_charge;//断网充电标志
	int		allow_offline_charge_kw_amout;//离线可充电电量
	u32     account_balance;
	u8       startmode; //1 远程充电 0 卡充电
	ql_fee_config  fee_config;
} Charge_Arg;//xj_cmd_7;

// 遥信数据 
typedef struct
{
	unsigned char yx_dc_pf22[8];
	unsigned char yx_dc_pf23[8];
	unsigned char yx_ac_pf32[8];
} out_yx;

// 主控更新的数据 
typedef struct
{
   int errcode;
	out_yx  yx_data;
} main_yx;//从主控接收的摇信

// 主站成功
typedef struct
{
	Charge_Arg * p_chargepara;
    start_mx * p_startInfo;
}StartInfo;//从主控接收的充电成功信息

// 回调接口
typedef int (*callbackFun)(u8, void *);

// 命令处理函数指针
typedef int	(*AdjPw)(u8 gunid,u8 type,int value);

// 解闭锁
typedef int (*unlock)(u8 gunid, u8 type);



typedef struct
{
	short  cmdtype;
	void   *body;
} cmdlist; //命令队列

// 命令处理函数指针
typedef int	(*cmd_process)(cmdlist *);

typedef void (*callbackFun_log)(const char  *);

typedef struct
{
	char type;              // 1: 直流,     2:交流
	unsigned char gunnum;   // 充电枪数量
	char  devNo[32];        // 设备序号
	u16   rated_v;          // 额定电压
	u16   rated_i;          // 额定电流
	u16   max_v;            // 最大电压
	u16   max_i;            // 最大电流
	u16   max_power;        // 最大功率
	u16   min_power;        // 最小功率
	u16   rated_power;      // 额定功率

	char  server_ip[32];    // 服务器IP
	u32   server_port;        // 端口

    char  interface_id[12];     // 接口ID
    char  token[20];            // 接口token
    
	u16	  charge_mode_num;    // 模块个数
    u16   charge_mode_rate;     // 总功率
    callbackFun startCharge;    // 开始充电接口
    callbackFun stopCharge;     // 停止充电接口
    callbackFun_log writelog;   // 写日志接口
 	AdjPw  adjust_charge_pw;    // 调整充电功率
 	unlock unlock_func;         // 解锁操作
	cmd_process     cmd_fun;    // 命令处理函数指针

	ql_fee_config  fee_config;
}ql_para_form_main; //从主控传来的参数  _tmp_print_str

typedef struct
{
    u8  rateid;//时段号，也是费率号
    u8  gun_id;	// 0~1
    u32 curkWh[49];//当前累计电量
    u32 kWhStart[5];//开始充电时电表示值
    u32 kWhEnd[5];//开始充电时电表示值
    u32 charge_duration;//充电持续时间
    u32 start_soc;  // 起始电池电量
    u32 end_soc;    // 结束电池电量
    u32 cost_elec;  // 充电花费
    u32 cost_server;    // 服务花费
    TDateTime startChargingtime;//开始充电时时间
    TDateTime endChargingtime;//当前充电时时间
    u32 cur_elec;   // 当前费率
    u32 cur_servicer;
}MeterData_ql;

// 初始化与青莲云通讯任务，初始化参数 
int initQlCloud(void *pxj);

// 更新遥信处理 
int QL_updateYX(u8 gunid, void *p_data);

// 更新遥测处理 
int QL_updateYC(u8 gunid, void *p_data);

// 更新电表数据处理 
int QL_updateMtData(u8 gunid, void* pdata);

// 
int QL_updateMtDataReal(u8 gunid, void* pdata);

int QL_finStartCharge(u8 gunid,void* pdata);

int QL_finStopCharge(u8 gunid,void* pdata);

#ifdef __cplusplus
}
#endif

#endif


